/* 观察者 */
class Observer {
    constructor(data) {
        this.toReactive(data);
    }

    // 遍历 data($data)中的属性，把属性转换成响应式数据
    toReactive(data) {
        // data必须为一个对象（递归终止条件）
        if (!data || typeof data !== "object") {
            return;
        }

        /* 将app.$data中的每个key都定义为响应式数据 */
        Object.keys(data).forEach((key) => {
            this.defineReactive(data, key, data[key]);
        });
    }

    // 定义响应式数据
    defineReactive(data, key, value) {
        const that = this;

        // 负责收集依赖并发送通知
        let dep = new Dep();

        /* 如果通过app.$data去读写数据 */
        Object.defineProperty(data, key, {
            enumerable: true,
            configurable: true,

            get() {
                // 收集依赖
                Dep.target && dep.addSub(Dep.target);
                return value;
            },

            set(newValue) {
                // console.log("set", obj, key, newValue);
                if (value === newValue) {
                    return;
                }

                value = newValue;

                // 如果新设置的值为对象，也转换成响应式数据
                that.toReactive(newValue);

                // 发送通知
                dep.notify();
            },
        });

        // 利用递归使深层（内部）属性转换成响应式数据
        this.toReactive(value);
    }
}
